import Vue from 'vue';
import VueRouter from 'vue-router';
//引入路由配置
import routes from './routes';
//使用路由插件
Vue.use(VueRouter);


//先把VueRouter原型对象的push和replace保存一份
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;
/** 重写push|replace
 * params：
 *  location：告诉原来的push函数往哪里跳转(传递哪些参数)
 *  resolve：成功的回调
 *   
 */
VueRouter.prototype.push = function(location,resolve,reject){
    //函数上下文为VueRouter类的一个实例,这里this指向的是push函数的调用者,也就是VueRouter实例
    if(resolve && reject){//如果传了成功和失败的回调,就是直接使用
        //将this指向指回VueRouter实例
        originPush.call(this,location,resolve,reject);
    }else{//如果没有传递成功或失败的回调,就默认传递一个
        originPush.call(this,location,()=>{},()=>{});
    }
}
VueRouter.prototype.replace = function(location,resolve,reject){
    if(resolve && reject){
        originReplace.call(this,location,resolve,reject);
    }else{
        originReplace.call(this,location,()=>{},()=>{});
    }
}

//配置路由
let router = new VueRouter({
    routes,//配置路由    
    scrollBehavior(to,from,savePosition){//滚动行为
        //返回的这个y=0，代表的滚动条在最上面
        console.log(to,from,savePosition);
        return {y: 0};
      
    }
})

// 全局的导航守卫 - 前置导航守卫 - 路由拦截
// 如果是跳转到购物车页面，那么需要先判断是否登录(token)，
// 如果是跳转到其他任何页面，就直接next()
// to代表即将进入的路由
// from代表即将离开的路由
// next(),每一个导航守卫必须至少搭配一个next()

router.beforeEach((to, from, next) => {
    let token = localStorage.getItem('userToken')
    if (to.path === '/cart') {
      if (token) {
        next(); //这个next只针对去往/cart的
      } else {
        // 因为路由组件没有this，所以只能在vue的原型上找
        Vue.prototype.$toast.loading({
          message: '请先登录...',
          forbidClick: true,
        });
        setTimeout(() => {
          next('/user')
          // 修改vuex中的ifgoBack
        //   Store.commit("changeIfgoBack", true);
        }, 800)
      }
      return;
    }
    // 这个next是适配所有路由的
    next()
  })
  

//暴露路由器
export default router;